package com.tjetc.controller;

import com.tjetc.common.JsonResult;
import com.tjetc.entity.TravelGuide;
import com.tjetc.service.TravelGuideService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

/**
 * 旅游攻略控制器
 * 提供RESTful API接口，处理前端与服务层之间的请求和响应
 * 包含查询、创建、更新、删除攻略及用户交互功能的HTTP端点
 */
@RestController
@RequestMapping("travel-guide")
public class TravelGuideController {

    /**
     * 注入攻略服务对象，用于处理业务逻辑
     */
    @Autowired
    private TravelGuideService travelGuideService;

    /**
     * 获取攻略详情
     * 根据ID查询单个攻略的完整信息
     * 请求路径示例: GET /travel-guide/detail/1
     *
     * @param id 攻略ID，从路径变量中获取
     * @return 包含攻略详细信息的JsonResult对象
     */
    @GetMapping("detail/{id}")
    public JsonResult getGuideDetail(@PathVariable("id") Long id) {
        return travelGuideService.findGuideById(id);
    }

    /**
     * 获取热门攻略
     * 返回按照浏览量排序的热门攻略列表
     * 请求路径示例: GET /travel-guide/hot/5
     *
     * @param limit 返回的攻略数量上限，从路径变量中获取
     * @return 包含热门攻略列表的JsonResult对象
     */
    @GetMapping("hot/{limit}")
    public JsonResult getHotGuides(@PathVariable("limit") Integer limit) {
        return travelGuideService.getHotGuides(limit);
    }

    /**
     * 按目的地查询攻略
     * 返回目的地名称包含指定字符串的攻略列表
     * 请求路径示例: GET /travel-guide/destination/北京
     *
     * @param destination 目的地名称，从路径变量中获取
     * @return 包含匹配目的地攻略列表的JsonResult对象
     */
    @GetMapping("destination/{destination}")
    public JsonResult getByDestination(@PathVariable("destination") String destination) {
        return travelGuideService.findByDestination(destination);
    }

    /**
     * 获取指定作者的攻略
     * 返回特定作者创建的所有攻略列表
     * 请求路径示例: GET /travel-guide/author/123
     *
     * @param authorId 作者ID，从路径变量中获取
     * @return 包含作者攻略列表的JsonResult对象
     */
    @GetMapping("author/{authorId}")
    public JsonResult getByAuthor(@PathVariable("authorId") Long authorId) {
        return travelGuideService.findByAuthor(authorId);
    }

    /**
     * 获取推荐攻略
     * 返回系统标记为推荐的攻略列表
     * 请求路径示例: GET /travel-guide/featured/4
     *
     * @param limit 返回的攻略数量上限，从路径变量中获取
     * @return 包含推荐攻略列表的JsonResult对象
     */
    @GetMapping("featured/{limit}")
    public JsonResult getFeatured(@PathVariable("limit") Integer limit) {
        return travelGuideService.getFeatured(limit);
    }

    /**
     * 获取编辑推荐攻略
     * 返回被编辑推荐的攻略列表
     * 请求路径示例: GET /travel-guide/editor-choice/6
     *
     * @param limit 返回的攻略数量上限，从路径变量中获取
     * @return 包含编辑推荐攻略列表的JsonResult对象
     */
    @GetMapping("editor-choice/{limit}")
    public JsonResult getEditorChoice(@PathVariable("limit") Integer limit) {
        return travelGuideService.getEditorChoice(limit);
    }

    /**
     * 创建新攻略
     * 接收并处理用户提交的攻略数据，创建新攻略记录
     * 请求路径示例: POST /travel-guide/create
     *
     * @param guide 攻略对象，从请求体中获取
     * @return 包含创建结果和攻略信息的JsonResult对象
     */
    @PostMapping("create")
    public JsonResult createGuide(@RequestBody TravelGuide guide) {
        // Ensure trip_data has at least a minimal structure
        if (guide.getTripData() == null) {
            guide.setTripData("{\"title\":\"" + guide.getTitle() + "\",\"destination\":\"" + guide.getDestination() + "\"}");
        }

        return travelGuideService.createGuide(guide);
    }

    /**
     * 更新攻略信息
     * 接收并处理用户提交的攻略更新数据
     * 请求路径示例: PUT /travel-guide/update
     *
     * @param guide 更新后的攻略对象，从请求体中获取
     * @return 包含更新结果和攻略信息的JsonResult对象
     */
    @PutMapping("update")
    public JsonResult updateGuide(@RequestBody TravelGuide guide) {
        return travelGuideService.updateGuide(guide);
    }

    /**
     * 删除攻略
     * 根据ID删除指定的攻略(逻辑删除)
     * 请求路径示例: DELETE /travel-guide/delete/10
     *
     * @param id 要删除的攻略ID，从路径变量中获取
     * @return 包含删除结果的JsonResult对象
     */
    @DeleteMapping("delete/{id}")
    public JsonResult deleteGuide(@PathVariable("id") Long id) {
        return travelGuideService.deleteGuide(id);
    }

    /**
     * 上传攻略封面图片
     * 接收并处理用户上传的图片文件，保存到服务器并更新攻略封面
     * 请求路径示例: POST /travel-guide/upload-cover
     *
     * @param file 上传的图片文件，从请求参数中获取
     * @param guideId 攻略ID，从请求参数中获取
     * @return 包含上传结果和图片路径的JsonResult对象
     */
    @PostMapping("upload-cover")
    public JsonResult uploadCover(@RequestParam("file") MultipartFile file,
                                  @RequestParam("guideId") Long guideId) {
        return travelGuideService.uploadCoverImage(file, guideId);
    }

    /**
     * 点赞攻略
     * 增加指定攻略的点赞次数
     * 请求路径示例: POST /travel-guide/like/5
     *
     * @param id 攻略ID，从路径变量中获取
     * @return 包含点赞结果的JsonResult对象
     */
    @PostMapping("like/{id}")
    public JsonResult likeGuide(@PathVariable("id") Long id) {
        return travelGuideService.likeGuide(id);
    }

    /**
     * 收藏攻略
     * 增加指定攻略的收藏次数
     * 请求路径示例: POST /travel-guide/favorite/5
     *
     * @param id 攻略ID，从路径变量中获取
     * @return 包含收藏结果的JsonResult对象
     */
    @PostMapping("favorite/{id}")
    public JsonResult favoriteGuide(@PathVariable("id") Long id) {
        return travelGuideService.favoriteGuide(id);
    }
}